<%@page import="java.util.concurrent.ConcurrentHashMap"%>
<%@page import="java.util.concurrent.CopyOnWriteArrayList"%>
<%@ page
	import="java.util.*,java.net.*,java.text.*,java.util.zip.*,java.io.*"%>
<%@ page contentType="text/html;charset=UTF-8"%>
<%!/*
	 **************************************************************************************
	 *JSP 文件管理器 v1.001                                                               *
	 *Copyright (C) 2003 by Bagheera                                                      *
	 *E-mail:bagheera@beareyes.com                                                        *
	 *QQ:179189585                                                                        *
	 *http://jmmm.com                                                                     *
	 *------------------------------------------------------------------------------------*
	 *警告:请不要随便修改以上版权信息!                                                    *
	 **************************************************************************************
	 *#######免费空间管理系统正在完善之中，请到这里测试并发表宝贵意见:                    *
	 **http://jmmm.com/web/index.jsp    测试帐号:test  密码:test                          *
	 **************************************************************************************
	 */
	private static final String privateDir = "/home/files";
	//编辑器显示列数
	private static final int EDITFIELD_COLS = 100;
	//编辑器显示行数
	private static final int EDITFIELD_ROWS = 30;
	//-----------------------------------------------------------------------------

	//改变上传文件是的缓冲目录(一般不需要修改)
	private static String tempdir = ".";

	public class FileInfo {
		public String name = null, clientFileName = null,
				fileContentType = null;
		private byte[] fileContents = null;
		public File file = null;
		public StringBuffer sb = new StringBuffer(100);
		public void setFileContents(byte[] aByteArray) {
			fileContents = new byte[aByteArray.length];
			System.arraycopy(aByteArray, 0, fileContents, 0, aByteArray.length);
		}
	}

	public class HttpMultiPartParser {
		private final String lineSeparator = System.getProperty(
				"line.separator", "\n");
		private final int ONE_MB = 1024 * 1024 * 1;

		public Map<String, Object> processData(ServletInputStream is, String boundary,
				String saveInDir) throws IllegalArgumentException, IOException {
			if (is == null)
				throw new IllegalArgumentException("InputStream");
			if (boundary == null || boundary.trim().length() < 1)
				throw new IllegalArgumentException("boundary");
			boundary = "--" + boundary;
			StringTokenizer stLine = null, stFields = null;
			FileInfo fileInfo = null;
			Map<String, Object> dataTable = new ConcurrentHashMap<String, Object>(5);
			String line = null, field = null, paramName = null;
			boolean saveFiles = (saveInDir != null && saveInDir.trim().length() > 0), isFile = false;
			if (saveFiles) {
				File f = new File(saveInDir);
				f.mkdirs();
			}
			line = getLine(is);
			if (line == null || !line.startsWith(boundary))
				throw new IOException("未发现;" + " boundary = " + boundary
						+ ", line = " + line);
			while (line != null) {
				if (line == null || !line.startsWith(boundary))
					return dataTable;
				line = getLine(is);
				if (line == null)
					return dataTable;
				stLine = new StringTokenizer(line, ";\r\n");
				if (stLine.countTokens() < 2)
					throw new IllegalArgumentException("出现错误!");
				line = stLine.nextToken().toLowerCase();
				if (line.indexOf("form-data") < 0)
					throw new IllegalArgumentException("出现错误!");
				stFields = new StringTokenizer(stLine.nextToken(), "=\"");
				if (stFields.countTokens() < 2)
					throw new IllegalArgumentException("出现错误!");
				fileInfo = new FileInfo();
				stFields.nextToken();
				paramName = stFields.nextToken();
				isFile = false;
				if (stLine.hasMoreTokens()) {
					field = stLine.nextToken();
					stFields = new StringTokenizer(field, "=\"");
					if (stFields.countTokens() > 1) {
						if (stFields.nextToken().trim()
								.equalsIgnoreCase("filename")) {
							fileInfo.name = paramName;
							String value = stFields.nextToken();
							if (value != null && value.trim().length() > 0) {
								fileInfo.clientFileName = value;
								isFile = true;
							} else {
								line = getLine(is); // 去掉"Content-Type:"行
								line = getLine(is); // 去掉空白行
								line = getLine(is); // 去掉空白行
								line = getLine(is); // 定位
								continue;
							}
						}
					} else if (field.toLowerCase().indexOf("filename") >= 0) {
						line = getLine(is); // 去掉"Content-Type:"行
						line = getLine(is); // 去掉空白行
						line = getLine(is); // 去掉空白行
						line = getLine(is); // 定位
						continue;
					}
				}
				boolean skipBlankLine = true;
				if (isFile) {
					line = getLine(is);
					if (line == null)
						return dataTable;
					if (line.trim().length() < 1)
						skipBlankLine = false;
					else {
						stLine = new StringTokenizer(line, ": ");
						if (stLine.countTokens() < 2)
							throw new IllegalArgumentException("出现错误!");
						stLine.nextToken();
						fileInfo.fileContentType = stLine.nextToken();
					}
				}
				if (skipBlankLine) {
					line = getLine(is);
					if (line == null)
						return dataTable;
				}
				if (!isFile) {
					line = getLine(is);
					if (line == null)
						return dataTable;
					dataTable.put(paramName, line);
					//判断是否为目录
					if (paramName.equals("dir")) {
						saveInDir = line;
						System.out.println(line);
					}
					line = getLine(is);
					continue;
				}
				try {
					OutputStream os = null;
					String path = null;
					if (saveFiles)
						os = new FileOutputStream(path = getFileName(saveInDir,
								fileInfo.clientFileName));
					else
						os = new ByteArrayOutputStream(ONE_MB);
					boolean readingContent = true;
					byte previousLine[] = new byte[2 * ONE_MB];
					byte temp[] = null;
					byte currentLine[] = new byte[2 * ONE_MB];
					int read, read3;
					if ((read = is.readLine(previousLine, 0,
							previousLine.length)) == -1) {
						line = null;
						break;
					}
					while (readingContent) {
						if ((read3 = is.readLine(currentLine, 0,
								currentLine.length)) == -1) {
							line = null;
							break;
						}
						if (compareBoundary(boundary, currentLine)) {
							os.write(previousLine, 0, read);
							os.flush();
							line = new String(currentLine, 0, read3);
							break;
						} else {
							os.write(previousLine, 0, read);
							os.flush();
							temp = currentLine;
							currentLine = previousLine;
							previousLine = temp;
							read = read3;
						}
					}
					os.close();
					temp = null;
					previousLine = null;
					currentLine = null;
					if (!saveFiles) {
						ByteArrayOutputStream baos = (ByteArrayOutputStream) os;
						fileInfo.setFileContents(baos.toByteArray());
					} else {
						fileInfo.file = new File(path);
						os = null;
					}
					dataTable.put(paramName, fileInfo);
				} catch (IOException e) {
					throw e;
				}
			}
			return dataTable;
		}

		// 比较数据
		private boolean compareBoundary(String boundary, byte ba[]) {
			byte b;
			if (boundary == null || ba == null)
				return false;
			for (int i = 0; i < boundary.length(); i++)
				if ((byte) boundary.charAt(i) != ba[i])
					return false;
			return true;
		}

		private synchronized String getLine(ServletInputStream sis)
				throws IOException {
			byte b[] = new byte[1024];
			int read = sis.readLine(b, 0, b.length), index;
			String line = null;
			if (read != -1) {
				line = new String(b, 0, read);
				if ((index = line.indexOf('\n')) >= 0)
					line = line.substring(0, index - 1);
			}
			b = null;
			return line;
		}

		public String getFileName(String dir, String fileName)
				throws IllegalArgumentException {
			String path = null;
			if (dir == null || fileName == null)
				throw new IllegalArgumentException("目录或者文件不存在!");
			int index = fileName.lastIndexOf('/');
			String name = null;
			if (index >= 0)
				name = fileName.substring(index + 1);
			else
				name = fileName;
			index = name.lastIndexOf('\\');
			if (index >= 0)
				fileName = name.substring(index + 1);
			path = dir + File.separator + fileName;
			if (File.separatorChar == '/')
				return path.replace('\\', File.separatorChar);
			else
				return path.replace('/', File.separatorChar);
		}
	}

	/**
	 * 下面这个类是为文件和目录排序
	 * @author bagheera
	 * @version 1.001
	 */
	class FileComp implements Comparator<File> {
		int mode = 1;
		/**
		 * @排序方法 1=文件名, 2=大小, 3=日期
		 */
		FileComp(int mode) {
			this.mode = mode;
		}
		public int compare(File f1, File f2) {
			if (f1.isDirectory()) {
				if (f2.isDirectory()) {
					switch (mode) {
						case 1 :
							return f1
									.getAbsolutePath()
									.toUpperCase()
									.compareTo(
											f2.getAbsolutePath().toUpperCase());
						case 2 :
							return new Long(f1.length()).compareTo(new Long(f2
									.length()));
						case 3 :
							return new Long(f1.lastModified())
									.compareTo(new Long(f2.lastModified()));
						default :
							return 1;
					}
				} else
					return -1;
			} else if (f2.isDirectory())
				return 1;
			else {
				switch (mode) {
					case 1 :
						return f1.getAbsolutePath().toUpperCase()
								.compareTo(f2.getAbsolutePath().toUpperCase());
					case 2 :
						return new Long(f1.length()).compareTo(new Long(f2
								.length()));
					case 3 :
						return new Long(f1.lastModified()).compareTo(new Long(
								f2.lastModified()));
					default :
						return 1;
				}
			}
		}
	}

	class Writer2Stream extends OutputStream {
		Writer out;
		Writer2Stream(Writer w) {
			super();
			out = w;
		}
		public void write(int i) throws IOException {
			out.write(i);
		}
		public void write(byte[] b) throws IOException {
			for (int i = 0; i < b.length; i++) {
				int n = b[i];
				//Convert byte to ubyte
				n = ((n >>> 4) & 0xF) * 16 + (n & 0xF);
				out.write(n);
			}
		}
		public void write(byte[] b, int off, int len) throws IOException {
			for (int i = off; i < off + len; i++) {
				int n = b[i];
				n = ((n >>> 4) & 0xF) * 16 + (n & 0xF);
				out.write(n);
			}
		}
	}

	static List<File> expandFileList(String[] files, boolean inclDirs) {
		List<File> v = new CopyOnWriteArrayList<File>();
		if (files == null)
			return v;
		for (int i = 0; i < files.length; i++)
			v.add(new File(URLDecoder.decode(files[i])));
		for (int i = 0; i < v.size(); i++) {
			File f = (File) v.get(i);
			if (f.isDirectory()) {
				File[] fs = f.listFiles();
				for (int n = 0; n < fs.length; n++)
					v.add(fs[n]);
				if (!inclDirs) {
					v.remove(i);
					i--;
				}
			}
		}
		return v;
	}

	static String substr(String s, String search, String replace) {
		StringBuffer s2 = new StringBuffer();
		int i = 0, j = 0;
		int len = search.length();
		while (j > -1) {
			j = s.indexOf(search, i);
			if (j > -1) {
				s2.append(s.substring(i, j));
				s2.append(replace);
				i = j + len;
			}
		}
		s2.append(s.substring(i, s.length()));
		return s2.toString();
	}

	static String getDir(String dir, String name) {
		if (!dir.endsWith(File.separator))
			dir = dir + File.separator;
		File mv = new File(name);
		String new_dir = null;
		if (!mv.isAbsolute()) {
			new_dir = dir + name;
		} else
			new_dir = name;
		return new_dir;
	}%>

<%
	String tempDir = request.getParameter("dir");
	if(tempDir != null){
		if(tempDir.startsWith(privateDir)){
			request.setAttribute("dir", tempDir);
		}else{
			request.setAttribute("dir", privateDir);
		}
	}
	String browser_name = request.getRequestURI();

	//查看文件
	if (request.getParameter("file") != null) {
		File f = new File(request.getParameter("file"));
		BufferedInputStream reader = new BufferedInputStream(
				new FileInputStream(f));
		int l = f.getName().lastIndexOf(".");
		//判断文件后缀
		if (l >= 0) {
			String ext = f.getName().substring(l).toLowerCase();
			if (ext.equals(".jpg") || ext.equals(".jpeg")
					|| ext.equals(".jpe"))
				response.setContentType("image/jpeg");
			else if (ext.equals(".gif"))
				response.setContentType("image/gif");
			else if (ext.equals(".pdf"))
				response.setContentType("application/pdf");
			else if (ext.equals(".htm") || ext.equals(".html")
					|| ext.equals(".shtml"))
				response.setContentType("text/html");
			else if (ext.equals(".avi"))
				response.setContentType("video/x-msvideo");
			else if (ext.equals(".mov") || ext.equals(".qt"))
				response.setContentType("video/quicktime");
			else if (ext.equals(".mpg") || ext.equals(".mpeg")
					|| ext.equals(".mpe"))
				response.setContentType("video/mpeg");
			else if (ext.equals(".zip"))
				response.setContentType("application/zip");
			else if (ext.equals(".tiff") || ext.equals(".tif"))
				response.setContentType("image/tiff");
			else if (ext.equals(".rtf"))
				response.setContentType("application/rtf");
			else if (ext.equals(".mid") || ext.equals(".midi"))
				response.setContentType("audio/x-midi");
			else if (ext.equals(".xl") || ext.equals(".xls")
					|| ext.equals(".xlv") || ext.equals(".xla")
					|| ext.equals(".xlb") || ext.equals(".xlt")
					|| ext.equals(".xlm") || ext.equals(".xlk"))
				response.setContentType("application/excel");
			else if (ext.equals(".doc") || ext.equals(".dot"))
				response.setContentType("application/msword");
			else if (ext.equals(".png"))
				response.setContentType("image/png");
			else if (ext.equals(".xml"))
				response.setContentType("text/xml");
			else if (ext.equals(".svg"))
				response.setContentType("image/svg+xml");
			else
				response.setContentType("text/plain");
		} else
			response.setContentType("text/plain");
		response.setContentLength((int) f.length());
		out.clearBuffer();
		int i;
		while ((i = reader.read()) != -1)
			out.write(i);
		reader.close();
		out.flush();
	}
	//保存所选中文件为zip文件
	else if ((request.getParameter("Submit") != null)
			&& (request.getParameter("Submit").equals("Save as zip"))) {
		List<File> v = expandFileList(
				request.getParameterValues("selfile"), false);
		File dir_file = new File("" + request.getAttribute("dir"));
		int dir_l = dir_file.getAbsolutePath().length();
		response.setContentType("application/zip");
		response.setHeader("Content-Disposition",
				"attachment;filename=\"bagheera.zip\"");
		out.clearBuffer();
		ZipOutputStream zipout = new ZipOutputStream(new Writer2Stream(
				out));
		zipout.setComment("Created by JSP 文件管理器 1.001");
		for (int i = 0; i < v.size(); i++) {
			File f = (File) v.get(i);
			if (f.canRead()) {
				zipout.putNextEntry(new ZipEntry(f.getAbsolutePath()
						.substring(dir_l + 1)));
				BufferedInputStream fr = new BufferedInputStream(
						new FileInputStream(f));
				int b;
				while ((b = fr.read()) != -1)
					zipout.write(b);
				fr.close();
				zipout.closeEntry();
			}
		}
		zipout.finish();
		out.flush();
	}
	//下载文件
	else if (request.getParameter("downfile") != null) {
		String filePath = request.getParameter("downfile");
		File f = new File(filePath);
		if (f.exists() && f.canRead()) {
			response.setContentType("application/octet-stream");
			response.setHeader("Content-Disposition",
					"attachment;filename=\"" + f.getName() + "\"");
			response.setContentLength((int) f.length());
			BufferedInputStream fileInputStream = new BufferedInputStream(
					new FileInputStream(f));
			int i;
			out.clearBuffer();
			while ((i = fileInputStream.read()) != -1)
				out.write(i);
			fileInputStream.close();
			out.flush();
		} else {
			out.println("<html><body><h1>文件" + f.getAbsolutePath()
					+ "不存在或者无读权限</h1></body></html>");
		}
	}

	else {
		if (request.getAttribute("dir") == null) {
			//request.setAttribute("dir", application.getRealPath("."));////////////////////////这里，改了这里
			request.setAttribute("dir", privateDir);
		}
%>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<style type="text/css">
.login {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 8pt;
	color: #666666;
	width: 320px;
}

.header {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 10pt;
	color: #666666;
	font-weight: bold;
}

.tableHeader {
	background-color: #c0c0c0;
	color: #666666;
}

.tableHeaderLight {
	background-color: #cccccc;
	color: #666666;
}

.main {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 8pt;
	color: #666666;
}

.copy {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 8pt;
	color: #999999;
}

.copy:Hover {
	color: #666666;
	text-decoration: underline;
}

.button {
	background-color: #c0c0c0;
	color: #666666;
	border-left: 1px solid #999999;
	border-right: 1px solid #999999;
	border-top: 1px solid #999999;
	border-bottom: 1px solid #999999
}

.button:Hover {
	color: #444444
}

td {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 8pt;
	color: #666666;
}

A {
	text-decoration: none;
}

A:Hover {
	color: Red;
	text-decoration: underline;
}

BODY {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 8pt;
	color: #666666;
}
</style>
<script type="text/javascript">
<!--
	var check = false;
	function dis() {
		check = true;
	}

	var DOM = 0, MS = 0, OP = 0;
	function CheckBrowser() {
		if (window.opera)
			OP = 1;
		if (document.getElementById) {
			DOM = 1;
		}
		if (document.all && !OP) {
			MS = 1;
		}
	}

	function selrow(element, i) {
		CheckBrowser();
		var erst;
		if ((OP == 1) || (MS == 1))
			erst = element.firstChild.firstChild;
		else if (DOM == 1)
			erst = element.firstChild.nextSibling.firstChild;
		//MouseIn

		if (i == 0)
			if (erst.checked == true)
				element.style.backgroundColor = '#dddddd';
			else
				element.style.backgroundColor = '#eeeeee';
		//MouseOut

		else if (i == 1) {
			if (erst.checked == true)
				element.style.backgroundColor = '#dddddd';
			else
				element.style.backgroundColor = '#ffffff';
		}
		//MouseClick

		else if ((i == 2) && (!check)) {
			if (erst.checked == true)
				element.style.backgroundColor = '#eeeeee';
			else
				element.style.backgroundColor = '#dddddd';
			erst.click();
		} else
			check = false;
	}
//-->

</script>
<%
	}
	//上传
	if ((request.getContentType() != null)
			&& (request.getContentType().toLowerCase()
					.startsWith("multipart"))) {
		response.setContentType("text/html");
		HttpMultiPartParser parser = new HttpMultiPartParser();
		boolean error = false;
		try {
			Map<String, Object> ht = parser.processData(request.getInputStream(),
					"-", tempdir);
			if (ht.get("myFile") != null) {
				FileInfo fi = (FileInfo) ht.get("myFile");
				File f = fi.file;
				//把文件从缓冲目录里复制出来
				String path = (String) ht.get("dir");
				if (!path.endsWith(File.separator))
					path = path + File.separator;
				if (!f.renameTo(new File(path + f.getName()))) {
					request.setAttribute("message", "无法上传文件.");
					error = true;
					f.delete();
				}
			} else {
				request.setAttribute("message", "请选中上传文件!");
				error = true;
			}
			String getDir = (String) ht.get("dir");
			if(getDir.startsWith(privateDir)){
				request.setAttribute("dir", (String) ht.get("dir"));
			}else{
				request.setAttribute("dir", privateDir);
			}
		} catch (Exception e) {
			request.setAttribute("message", "发生如下错误:" + e + ". 上传失败!");
			error = true;
		}
		if (!error)
			request.setAttribute("message", "文件上传成功.");
	} else if (request.getParameter("editfile") != null) {
%>
<title>JSP文件管理器-编辑文件:<%=request.getParameter("editfile")%></title>
</head>
<body>

	<%
		String encoding = "UTF-8";
			request.setAttribute("dir", null);
			File ef = new File(request.getParameter("editfile"));
			BufferedReader reader = new BufferedReader(new FileReader(ef));
			String disable = "";
			if (!ef.canWrite())
				disable = "无法打开文件";
			out.print("<form action=\"" + browser_name
					+ "\" method=\"Post\">\n"
					+ "<textarea name=\"text\" wrap=\"off\" cols=\""
					+ EDITFIELD_COLS + "\" rows=\"" + EDITFIELD_ROWS + "\""
					+ ">" + disable);

			String c;
			while ((c = reader.readLine()) != null) {
				c = substr(c, "&", "&amp;");
				c = substr(c, "<", "&lt;");
				c = substr(c, ">", "&gt;");
				c = substr(c, "\"", "&quot;");
				out.print(c + "\n");
			}
			reader.close();
			out.print("</textarea>");
	%>
	<input type="hidden" name="nfile"
		value="<%=request.getParameter("editfile")%>">
	<table>
		<tr>
			<td title="Enter the new filename"><input type="text"
				name="new_name" value="<%=ef.getName()%>"></td>
			<td><input type="Submit" name="Submit" value="保存"></td>
			<td><input type="Submit" name="Submit" value="取消"></td>
		</tr>
		<tr>
			<td><input type="checkbox" name="Backup" checked>覆写</td>
		</tr>
	</table>
	<%
		out.print("</form>");
	%>
	
</body>
</html>
<%
	}
	//保存文件
	else if (request.getParameter("nfile") != null) {
		File f = new File(request.getParameter("nfile"));
		File new_f = new File(getDir(f.getParent(),
				request.getParameter("new_name")));
		if (request.getParameter("Submit").equals("Save")) {
			if (new_f.exists()
					&& request.getParameter("Backup") != null) {
				File bak = new File(new_f.getAbsolutePath() + ".bak");
				bak.delete();
				new_f.renameTo(bak);
			}
			BufferedWriter outs = new BufferedWriter(new FileWriter(
					new_f));
			outs.write(request.getParameter("text"));
			outs.flush();
			outs.close();
		}
		if(f.getParent().startsWith(privateDir)){
			request.setAttribute("dir", f.getParent());
		}else{
			request.setAttribute("dir", privateDir);
		}
	}
	//删除文件
	else if ((request.getParameter("Submit") != null)
			&& (request.getParameter("Submit").equals("Delete Files"))) {
		List<File> v = expandFileList(
				request.getParameterValues("selfile"), true);
		boolean error = false;
		for (int i = v.size() - 1; i >= 0; i--) {
			File f = (File) v.get(i);
			if (!f.canWrite() || !f.delete()) {
				request.setAttribute("message",
						"无法删除文件" + f.getAbsolutePath() + ". 删除失败");
				error = true;
				break;
			}
		}
		if ((!error) && (v.size() > 1))
			request.setAttribute("message", "All files deleted");
		else if ((!error) && (v.size() > 0))
			request.setAttribute("message", "File deleted");
		else if (!error)
			request.setAttribute("message", "No files selected");
	}
	//建新目录
	else if ((request.getParameter("Submit") != null)
			&& (request.getParameter("Submit").equals("Create Dir"))) {
		String dir = "" + request.getAttribute("dir");
		String dir_name = request.getParameter("cr_dir");
		String new_dir = getDir(dir, dir_name);
		if (new File(new_dir).mkdirs()) {
			request.setAttribute("message", "目录创建完成");
		} else
			request.setAttribute("message", "创建新目录" + new_dir + "失败");
	}
	//创建文件
	else if ((request.getParameter("Submit") != null)
			&& (request.getParameter("Submit").equals("Create File"))) {
		String dir = "" + request.getAttribute("dir");
		String file_name = request.getParameter("cr_dir");
		String new_file = getDir(dir, file_name);
		//Test, if file_name is empty
		if ((file_name.trim() != "")
				&& !file_name.endsWith(File.separator)) {
			if (new File(new_file).createNewFile())
				request.setAttribute("message", "文件成功创建");
			else
				request.setAttribute("message", "创建文件" + new_file
						+ "失败");
		} else
			request.setAttribute("message", "错误: " + file_name
					+ "文件不存在");
	}
	//转移文件
	else if ((request.getParameter("Submit") != null)
			&& (request.getParameter("Submit").equals("Move Files"))) {
		List<File> v = expandFileList(
				request.getParameterValues("selfile"), true);
		String dir = "" + request.getAttribute("dir");
		String dir_name = request.getParameter("cr_dir");
		String new_dir = getDir(dir, dir_name);
		boolean error = false;
		if (!new_dir.endsWith(File.separator))
			new_dir += File.separator;
		for (int i = v.size() - 1; i >= 0; i--) {
			File f = (File) v.get(i);
			if (!f.canWrite()
					|| !f.renameTo(new File(new_dir
							+ f.getAbsolutePath().substring(
									dir.length())))) {
				request.setAttribute("message",
						"不能转移" + f.getAbsolutePath() + ".转移失败");
				error = true;
				break;
			}
		}
		if ((!error) && (v.size() > 1))
			request.setAttribute("message", "全部文件转移成功");
		else if ((!error) && (v.size() > 0))
			request.setAttribute("message", "文件转移成功");
		else if (!error)
			request.setAttribute("message", "请选择文件");
	}
	//复制文件
	else if ((request.getParameter("Submit") != null)
			&& (request.getParameter("Submit").equals("Copy Files"))) {
		List<File> v = expandFileList(
				request.getParameterValues("selfile"), true);
		String dir = (String) request.getAttribute("dir");
		if (!dir.endsWith(File.separator))
			dir += File.separator;
		String dir_name = request.getParameter("cr_dir");
		String new_dir = getDir(dir, dir_name);
		boolean error = false;
		if (!new_dir.endsWith(File.separator))
			new_dir += File.separator;
		byte buffer[] = new byte[0xffff];
		try {
			for (int i = 0; i < v.size(); i++) {
				File f_old = (File) v.get(i);
				File f_new = new File(new_dir
						+ f_old.getAbsolutePath().substring(
								dir.length()));
				if (f_old.isDirectory())
					f_new.mkdirs();
				else if (!f_new.exists()) {
					InputStream fis = new FileInputStream(f_old);
					OutputStream fos = new FileOutputStream(f_new);
					int b;
					while ((b = fis.read(buffer)) != -1)
						fos.write(buffer, 0, b);
					fis.close();
					fos.close();
				} else {
					//文件存在
					request.setAttribute("message",
							"无法复制" + f_old.getAbsolutePath()
									+ ",文件已经存在,复制失败");
					error = true;
					break;
				}
			}
		} catch (IOException e) {
			request.setAttribute("message", "错误" + e + ".复制取消");
			error = true;
		}
		if ((!error) && (v.size() > 1))
			request.setAttribute("message", "全部文件复制成功");
		else if ((!error) && (v.size() > 0))
			request.setAttribute("message", "文件复制成功");
		else if (!error)
			request.setAttribute("message", "请选择文件");
	}
	//目录浏览
	if ((request.getAttribute("dir") != null)) {
%>
<title>JSP文件管理器-目录浏览:<%=request.getAttribute("dir")%></title>
</head>
<body>
			<%
				out.println("<tr><td>");
				if (request.getAttribute("message") != null) {
						out.println("<table border=\"0\" width=\"100%\"><tr><td bgcolor=\"#FFFF00\" align=\"center\">");
						out.println(request.getAttribute("message"));
						out.println("</td></tr></table>");
					}
			%>
			<form action="<%=browser_name%>" method="Post">
				<table border="1" cellpadding="1" cellspacing="0" width="100%">
					<%
						String dir = URLEncoder
									.encode("" + request.getAttribute("dir"), "utf-8");
							String cmd = browser_name + "?dir=" + dir;
							out.println("<th bgcolor=\"#c0c0c0\"></th><th title=\"按文件名称排序\" bgcolor=\"#c0c0c0\"><a href=\""
									+ cmd
									+ "&sort=1\">文件名</a></th>"
									+ "<th title=\"按大小称排序\" bgcolor=\"#c0c0c0\"><a href=\""
									+ cmd
									+ "&sort=2\">大小</th>"
									+ "<th title=\"按日期称排序\" bgcolor=\"#c0c0c0\"><a href=\""
									+ cmd
									+ "&sort=3\">日期</th>"
									+ "<th bgcolor=\"#c0c0c0\">&nbsp;</th><th bgcolor=\"#c0c0c0\">&nbsp;</th>");
							char trenner = File.separatorChar;
							File f = new File("" + request.getAttribute("dir"));
							//跟或者分区
							//File[] entry = File.listRoots();
							File[] entry = { new File(getServletContext().getRealPath("/")) };
							for (int i = 0; i < entry.length; i++) {
								out.println("<tr bgcolor='#ffffff'\">");
								out.println("<td></td><td colspan=5><span style=\"background-color: rgb(255,255,255);color:rgb(255,0,0)\">");
								String name = URLEncoder.encode(entry[i].getAbsolutePath(), "utf-8");
								//String buf = entry[i].getAbsolutePath();
								String buf =  "root";
								out.println("◎<a href=\"" + browser_name + "?dir=" + name
										+ "\">[" + buf + "]</a>");
								out.println("</td></tr>");

							}
							out.println("<br>");
							//..
							if (f.getParent() != null&&!f.toString().equals(new File(getServletContext().getRealPath("/")).toString())) {
								out.println("<tr bgcolor='#ffffff' onmouseover=\"this.style.backgroundColor = '#eeeeee'\" onmouseout=\"this.style.backgroundColor = '#ffffff'\">");
								out.println("<td></td><td>");
								out.println("<a href=\"" + browser_name + "?dir="
										+ URLEncoder.encode(f.getParent(), "utf-8") + "\">[..]</a>");
								out.println("</td><td colspan=4>"+f.toString()+"</td></tr>");
							}
							//文件和目录
							entry = f.listFiles();
							if (entry != null && entry.length > 0) {
								int mode = 1;
								if (request.getParameter("sort") != null)
									mode = Integer.parseInt(request.getParameter("sort"));
								Arrays.sort(entry, new FileComp(mode));
								String ahref = "<a onmousedown=\"javascript:dis();\" href=\"";
								for (int i = 0; i < entry.length; i++) {
									String name = URLEncoder.encode(entry[i].getAbsolutePath(), "utf-8");
									String link;
									String dlink = "&nbsp;";
									String elink = "&nbsp;";
									String buf = entry[i].getName();
									if (entry[i].isDirectory()) {
										if (entry[i].canRead())
											link = ahref + browser_name + "?dir=" + name
													+ "\">[" + buf + "]</a>";
										else
											link = "[" + buf + "]";
									} else {
										if (entry[i].canRead()) {
											if (entry[i].canWrite()) {
												link = ahref + browser_name + "?file="
														+ name + "\">" + buf + "</a>";
												dlink = ahref + browser_name + "?downfile="
														+ name + "\">下载</a>";
												elink = ahref + browser_name + "?editfile="
														+ name + "\">编辑</a>";
											} else {
												link = ahref + browser_name + "?file="
														+ name + "\"><i>" + buf
														+ "</i></a>";
												dlink = ahref + browser_name + "?downfile="
														+ name + "\">下载</a>";
												elink = ahref + browser_name + "?editfile="
														+ name + "\">查看</a>";
											}
										} else {
											link = buf;
										}
									}
									String date = DateFormat.getDateTimeInstance().format(
											new Date(entry[i].lastModified()));
									out.println("<tr bgcolor='#ffffff' onmouseup = \"javascript:selrow(this, 2);\" "
											+ "onmouseover=\"javascript:selrow(this, 0);\" onmouseout=\"javascript:selrow(this, 1);\">");
									out.println("<td><input type=\"checkbox\" name=\"selfile\" value=\""
											+ name
											+ "\" onmousedown=\"javascript:dis();\"></td>");
									out.println("<td>" + link + "</td><td align=\"right\">"
											+ entry[i].length()
											+ " bytes</td><td align=\"right\">" + date
											+ "</td><td>" + dlink + "</td><td>" + elink
											+ "</td></tr>");
								}
							}
					%>
				</table>
				<input type="hidden" name="dir" value="<%=request.getAttribute("dir")%>" />
				<table>
					<tr>
						<td title="把所选文件打包下载"><input class="button" type="Submit"
							name="Submit" value="Save as zip"></td>
						<td colspan="2" title="删除所选文件和文件夹"><input class="button"
							type="Submit" name="Submit" value="Delete Files"></td>
					</tr>
					<tr>
						<td><input type="text" name="cr_dir"></td>
						<td><input class="button" type="Submit" name="Submit"
							value="Create Dir"></td>
						<td><input class="button" type="Submit" name="Submit"
							value="Create File"></td>
						<td><input class="button" type="Submit" name="Submit"
							value="Move Files"></td>
						<td><input class="button" type="Submit" name="Submit"
							value="Copy Files"></td>
					</tr>
				</table>
			</form>

			<form action="<%=browser_name%>" enctype="multipart/form-data"
				method="POST">
				<table cellpadding="0">
					<tr>
						<td><input type="hidden" name="dir"
							value="<%=request.getAttribute("dir")%>"> <input
							type="file" name="myFile"></td>
						<td><input type="Submit" class="button" name="Submit"
							value="Upload"></td>
					</tr>
				</table>
			</form>
			<hr>
</body>
</html>
<%
	}
%>